import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.decomposition import PCA

df = pd.read_csv("F:/成信大/多元统计分析/test4-2.csv")
data = df[df.columns[2:]]  # 选取分析的数据列
data_scale = (data - np.mean(data)) / np.std(data)  # 标准化

matrix = np.cov(data_scale.T)  # 求协方差矩阵(标准化后即相关系数矩阵)
print("相关性矩阵：", matrix, sep='\n')
value, vector = np.linalg.eig(matrix)  # 求标准化后的协方差矩阵的特征值和特征向量
print("特征值：", value, sep='\n')
print("特征向量：", vector, sep='\n')

pca = PCA()  # 这里没有设置主成分个数, 后面自己选取
pca.fit(data_scale)  # 训练PCA模型
print("pca模型得到的特征值（从大到小）:", pca.explained_variance_, sep='\n')
pvr = pca.explained_variance_ratio_  # 返回各个成分各自的方差百分比
print("各个成分的方差百分比：", pvr, sep='\n')
ca = np.cumsum(pvr)  # 计算累计贡献率
print("累计贡献率：", ca, sep='\n')
print("载荷矩阵：", pca.components_, sep='\n')  # 返回模型载荷矩阵

loading_y1 = pca.components_[0]  # 选取第一个主成分
result = "Y1 = "  # 保存第一个主成分表达式结果
for index in range(len(loading_y1)):
    if index == 0:
        result = result + str('%.6f' % loading_y1[index]) + "*X" + str(index + 1)
    else:
        result = result + " + " + str('%.6f' % loading_y1[index]) + "*X" + str(index + 1)

print("第一个主成分表达式：", result, sep='\n')  # 输出表达式结果

# 根据特征值和特征向量绘画碎石图
fig = plt.figure(figsize=(10, 4))
fig.add_subplot(121)
plt.scatter(range(1, 9), value)
plt.plot(range(1, 9), value)
plt.title('Scree Plot')
plt.xlabel('Component Number')
plt.ylabel('Eigen Value')
fig.add_subplot(122)
plt.scatter(range(1, 9), ca)
plt.plot(range(1, 9), ca)
plt.title('Cumulative Contribution ')
plt.xlabel('Component Number')
plt.ylabel('Cumulative Contribution ')
plt.show()
